<?php

namespace com\aristo\ingenieros\model;

include 'com/aristo/ingenieros/view/AccountView.php';
include 'com/aristo/ingenieros/view/AccountEntityView.php';
include 'com/aristo/ingenieros/view/EntityView.php';

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

use com\aristo\ingenieros\view\AccountView;
use com\aristo\ingenieros\view\AccountEntityView;
use com\aristo\ingenieros\view\EntityView;
use \Exception;
use \mysqli;

/**
 * Description of AccountQuery
 *
 * @author GINA
 */
class AccountQuery {

    /**
     * Funcion para obtener todas las cuentas contables o presupuestales
     * 
     * @param type $termino
     * @param type $tipo
     * @param mysqli $con
     * @return string
     */
    public static function getCuentas($termino, $tipo, $seccion, mysqli $con) {
        try {
            $termino = utf8_encode($termino);
            $tipo = utf8_encode($tipo);
            $seccion = utf8_encode($seccion);

            $sql = "SELECT
                        c.idcuenta,
                        sc.descripcion AS SECCION,
                        c.codigo,
                        c.descripcion,
                        (SELECT codigo FROM cuenta WHERE idcuenta = c.idpadre) as CODIGO_PADRE,
                        (SELECT descripcion FROM cuenta WHERE idcuenta = c.idpadre) AS DESCRIPCION_PADRE
                    FROM
                        cuenta AS c
                        INNER JOIN seccion_cuenta AS sc ON c.seccion_cuenta_id = sc.idseccion_cuenta
                        INNER JOIN tipo_cuenta AS tc ON sc.tipo_cuenta_id = tc.idtipo_cuenta
                    WHERE
                        c.eliminado = 'NO' AND
                        tc.descripcion = '" . $tipo . "' AND
                        (c.descripcion LIKE '%" . $termino . "%' OR c.codigo LIKE '" . $termino . "%')";

            if ($seccion !== "") {
                $sql .= " AND sc.descripcion = '" . $seccion . "'";
            }

            //$con->autocommit(FALSE);

            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $cuentas = array();
                    while ($row = $query->fetch_row()) {
                        $idCuenta = utf8_decode($row[0]);
                        $desseccion = utf8_decode($row[1]);
                        $codigo = utf8_decode($row[2]);
                        $descripcion = utf8_decode($row[3]);
                        $codPadre = utf8_decode($row[4]);
                        $desPadre = utf8_decode($row[5]);

                        $cuenta = new AccountView();
                        $cuenta->setId($idCuenta);
                        $cuenta->setSeccion($desseccion);
                        $cuenta->setDescripcion(trim($codigo . " - " . $descripcion));
                        $cuenta->setValue(trim($codigo . " - " . $descripcion));
                        $cuenta->setPadre(trim($codPadre . " - " . $desPadre));
                        $cuentas [] = $cuenta->toJSON();
                    }
                    return $cuentas;
                } else {
                    return "NO EXISTE CUENTAS CONFIGURADAS";
                }
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function getCuenta($id, $tipo, mysqli $con) {
        try {
            $id = utf8_encode($id);
            $tipo = utf8_encode($tipo);

            $sql = "SELECT
                        c.idcuenta,
                        sc.descripcion,
                        c.codigo,
                        c.descripcion,
                        (SELECT codigo FROM cuenta WHERE idcuenta = c.idpadre) as CODIGO_PADRE,
                        (SELECT descripcion FROM cuenta WHERE idcuenta = c.idpadre) AS DESCRIPCION_PADRE
                    FROM
                        cuenta AS c
                    INNER JOIN seccion_cuenta AS sc ON c.seccion_cuenta_id = sc.idseccion_cuenta
                    INNER JOIN tipo_cuenta AS tc ON sc.tipo_cuenta_id = tc.idtipo_cuenta
                    WHERE
                        tc.descripcion = '" . $tipo . "' AND c.idcuenta = " . $id;

            //$con->autocommit(FALSE);

            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $cuenta = new AccountEntityView();
                    while ($row = $query->fetch_row()) {
                        $id = utf8_decode($row[0]);
                        $seccion = utf8_decode($row[1]);
                        $codigo = utf8_decode($row[2]);
                        $descripcion = utf8_decode($row[3]);
                        $codPadre = utf8_decode($row[4]);
                        $desPadre = utf8_decode($row[5]);

                        $cuenta->setId($id);
                        $cuenta->setSeccion($seccion);
                        $cuenta->setCodigo($codigo);
                        $cuenta->setDescripcion($descripcion);
                        $cuenta->setCodpadre($codPadre);
                        $cuenta->setDespadre($desPadre);
                    }
                    return $cuenta->toJSON();
                } else {
                    return "CUENTA YA NO EXISTE";
                }
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function updateCuenta($id, $codigo, $descripcion, mysqli $con) {
        try {
            $id = utf8_encode($id);
            $codigo = ($codigo != "") ? utf8_encode($codigo) : "NULL";
            $descripcion = ($descripcion != "") ? utf8_encode($descripcion) : "NULL";

            $sql = "UPDATE cuenta SET codigo = '" . $codigo . "', descripcion = '" . $descripcion . "' WHERE idcuenta = " . $id;

            $con->autocommit(FALSE);

            $query = $con->query($sql);

            if ($query) {
                $rpta = new EntityView();
                $rpta->setResponse("SUCCESS");
                $rpta->setDescripcion("ACTUALIZADO CORRECTAMENTE");
                return $rpta->toJSON();
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function addCuenta($seccion, $codigo, $descripcion, $tipo, $idpadre, mysqli $con) {
        try {
            $seccion = utf8_encode($seccion);
            $codigo = ($codigo != "") ? utf8_encode($codigo) : "NULL";
            $descripcion = ($descripcion != "") ? utf8_encode($descripcion) : "NULL";
            //$tipo = utf8_encode($tipo);
            $idpadre = utf8_encode($idpadre);

            $sqlBuscaSeccion = "SELECT idseccion_cuenta FROM. seccion_cuenta WHERE descripcion = '" . $seccion . "'";

            $con->autocommit(FALSE);

            $search = $con->query($sqlBuscaSeccion);

            if ($search) {
                $idSeccion = "";
                while ($row = $search->fetch_row()) {
                    $idSeccion = utf8_decode($row[0]);
                }

                $sql = "INSERT INTO cuenta (codigo, descripcion, idpadre, seccion_cuenta_id) VALUES ('" . $codigo . "','" . $descripcion . "'," . $idpadre . "," . $idSeccion . ")";

                $query = $con->query($sql);

                if ($query) {
                    $rpta = new EntityView();
                    $rpta->setResponse("SUCCESS");
                    $rpta->setDescripcion("AGREGADO CORRECTAMENTE");
                    return $rpta->toJSON();
                } else {
                    return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                }
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function deleteCuenta($id, mysqli $con) {
        try {
            $id = utf8_encode($id);

            $sqlsearch = "SELECT COUNT(*) FROM cuenta WHERE idpadre = " . $id;

            $con->autocommit(FALSE);

            $search = $con->query($sqlsearch);

            if ($search) {
                $counthijos = "";
                while ($row = $search->fetch_row()) {
                    $counthijos = utf8_decode($row[0]);
                }
                if ($counthijos == 0) {
                    $sql = "UPDATE cuenta SET eliminado = 'SI' WHERE idcuenta = " . $id;

                    $query = $con->query($sql);

                    if ($query) {
                        $rpta = new EntityView();
                        $rpta->setResponse("SUCCESS");
                        $rpta->setDescripcion("ELIMINADO CORRECTAMENTE");
                        return $rpta->toJSON();
                    } else {
                        return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                    }
                } else {
                    return "ERROR: ELIMINE ANTES LAS CUENTAS ENLAZADAS";
                }
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }
    
    public static function getCuentasTipoCUENTAS(mysqli $con) {
        try {
            $sql = "SELECT
                        c.idcuenta,
                        c.codigo,
                        c.descripcion
                    FROM
                        cuenta AS c
                        INNER JOIN seccion_cuenta AS sc ON c.seccion_cuenta_id = sc.idseccion_cuenta
                        INNER JOIN tipo_cuenta AS tc ON sc.tipo_cuenta_id = tc.idtipo_cuenta
                    WHERE
                        tc.descripcion = 'CONTABLE' AND sc.descripcion = 'CUENTA'";

            //$con->autocommit(FALSE);

            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $cuentas = array();
                    while ($row = $query->fetch_row()) {
                        $idCuenta = utf8_decode($row[0]);
                        $codigo = utf8_decode($row[1]);
                        $descripcion = utf8_decode($row[2]);
                        
                        $cuenta = new AccountView();
                        $cuenta->setId($idCuenta);
                        $cuenta->setCodigo($codigo);
                        $cuenta->setDescripcion($descripcion);
                        $cuentas [] = $cuenta->toJSON();
                    }
                    return $cuentas;
                } else {
                    return "NO EXISTE CUENTAS CONFIGURADAS";
                }
            } else {
                return "ERROR DE RED. <br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

}